package com.and.video.service.util;


import com.and.video.domain.exception.ConditionException;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;

import java.util.Calendar;
import java.util.Date;

public class TokenUtil {

    private static final String ISSUER = "签发者";

    //  JWT（JSON Web Token）生成方法，用于基于用户ID创建加密的令牌
    public static String generateToken(Long userId) throws Exception{
        // 使用RSA256算法初始化签名密钥对
        Algorithm algorithm = Algorithm.RSA256(RSAUtil.getPublicKey(), RSAUtil.getPrivateKey());
        // 设置令牌过期时间（当前时间 + 1小时）。
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DAY_OF_WEEK, 8);

        return JWT.create()
                // 将用户ID设为JWT的kid（Key ID），便于后续关联用户。
                .withKeyId(String.valueOf(userId))
                // 设置签发者标识（常量ISSUER），用于区分不同服务。
                .withIssuer(ISSUER)
                // 设置过期时间
                .withExpiresAt(calendar.getTime())
                .sign(algorithm);
    }


    // 验证传入的 token，并返回其中存储的用户ID
    public static Long verifyToken(String token){
        try{
            // 初始化算法和验证器
            Algorithm algorithm = Algorithm.RSA256(RSAUtil.getPublicKey(), RSAUtil.getPrivateKey());
            JWTVerifier verifier = JWT.require(algorithm).build();

            // 验证Token并提取用户ID
            DecodedJWT jwt = verifier.verify(token);
            String userId = jwt.getKeyId();
            return Long.valueOf(userId);
        }catch (TokenExpiredException e){
            throw new ConditionException("555","token过期！");
        }catch (Exception e){
            throw new ConditionException("非法用户token！");
        }


    }

    public static String generateRefreshToken(Long userId) throws Exception{
        Algorithm algorithm = Algorithm.RSA256(RSAUtil.getPublicKey(), RSAUtil.getPrivateKey());
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DAY_OF_MONTH, 7);
        return JWT.create().withKeyId(String.valueOf(userId))
                .withIssuer(ISSUER)
                .withExpiresAt(calendar.getTime())
                .sign(algorithm);
    }
}
